/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package serv;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.List;
import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import prj.*;

/**
 *
 * @author ciro
 */
public class Servlet extends HttpServlet {

    @EJB
    private Gestore gestore;

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        try {
            String action = request.getParameter("action");
            if (action == null) {
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/index.jsp");
                rd.forward(request, response);
            }
            // Visualizza la pagina di registrazione
            if (action.equals("visualizzaRegistrazione")) {
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/registrazione.jsp");
                rd.forward(request, response);
            } // Effettua la registrazione
            else if (action.equals("registrazione")) {
                String user = (String) request.getParameter("scelta");
                if (user.equals("locale")) {
                    String email = (String) request.getParameter("emailLocale");
                    String indirizzo = (String) request.getParameter("indirizzoLocale");
                    String nome = (String) request.getParameter("nomeLocale");
                    String orario = (String) request.getParameter("orarioAp") + " - " + request.getParameter("orarioCh");
                    String numPosti = (String) request.getParameter("numPosti");
                    String pIVA = (String) request.getParameter("PIVA");
                    String proprietario = (String) request.getParameter("proprietario");
                    String telefono = (String) request.getParameter("telefono");
                    String pass = (String) request.getParameter("password");
                    String immagine = (String) request.getParameter("immagineLocale");
                    String descrizione = (String) request.getParameter("descrizioneLocale");
                    gestore.registraLocale(nome, proprietario, indirizzo, telefono, pIVA, numPosti, orario, email, pass, descrizione, immagine);
                    RequestDispatcher rd = getServletContext().getRequestDispatcher("/Servlet?action=locale&nome=" + nome);
                    rd.forward(request, response);
                } else {
                    String nome = ((String) request.getParameter("nome"));
                    String cognome = ((String) request.getParameter("cognome"));
                    String indirizzo = ((String) request.getParameter("indirizzo"));
                    String telefono = ((String) request.getParameter("telefonoC"));
                    String dataNascita = ((String) request.getParameter("dataNascita"));
                    String email = ((String) request.getParameter("email"));
                    String password = ((String) request.getParameter("password"));
                    gestore.registraCliente(nome, cognome, indirizzo, telefono, dataNascita, email, password);
                    RequestDispatcher rd = getServletContext().getRequestDispatcher("/index.jsp");
                    rd.forward(request, response);
                }
            } // Ricerca di locale/evento
            else if (action.equals("cerca")) {
                String search = (String) request.getParameter("cerca");
                String table = (String) request.getParameter("table");
                List<String[]> risultato = gestore.cerca(search, table);
                HttpSession s = request.getSession();
                s.setAttribute("risultato", risultato);
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/risultatiRicerca.jsp?tipo=" + table);
                rd.forward(request, response);
            } // Effettua il login
            else if (action.equals("login")) {
                String scelta = (String) request.getParameter("scelta");
                String user = (String) request.getParameter("user");
                String password = (String) request.getParameter("password");
                if (scelta == null || user == null || password == null) {
                    RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.jsp");
                    rd.forward(request, response);
                }
                String ris = gestore.login(user, password, scelta);
                if (ris != null) {
                    if (scelta.equals("locale")) {
                        List<String[]> risultato = gestore.cercaUno(ris, "locale");
                        List<String[]> risEventi = gestore.cercaEvento(ris);
                        HttpSession s = request.getSession();
                        s.setAttribute("risultato", risultato.get(0));
                        s.setAttribute("elencoEventi", risEventi);
                        s.setAttribute("login", ris);
                        s.setAttribute("group", scelta);
                        risultato.remove(0);
                        s.setAttribute("recensioni", risultato);
                        RequestDispatcher rd = getServletContext().getRequestDispatcher("/locale.jsp");
                        rd.forward(request, response);
                    } else {
                        HttpSession s = request.getSession();
                        s.setAttribute("login", ris);
                        s.setAttribute("group", scelta);
                        RequestDispatcher rd = getServletContext().getRequestDispatcher("/index.jsp");
                        rd.forward(request, response);
                    }
                } else {
                    RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.jsp?fail=true");
                    rd.forward(request, response);
                }
            } // Effettua una prenotazione
            else if (action.equals("prenota")) {
                String nome = (String) request.getParameter("nome");
                String tabella = (String) request.getParameter("tipo");
                String numPosti = (String) request.getParameter("numposti");
                HttpSession s = request.getSession();
                String cliente = (String) s.getAttribute("login");
                String data = (String) request.getParameter("data");
                boolean ris = gestore.prenota(tabella, nome, cliente, data, numPosti);
                if (!ris) {
                    RequestDispatcher rd = getServletContext().getRequestDispatcher("/Servlet?action=locale&nome=" + nome);
                    rd.forward(request, response);
                } else {
                    RequestDispatcher rd = getServletContext().getRequestDispatcher("/Servlet?action=visualizzaPrenotazioni");
                    rd.forward(request, response);
                }
            } // Effettua il logout
            else if (action.equals("logout")) {
                HttpSession s = request.getSession();
                s.invalidate();
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/index.jsp");
                rd.forward(request, response);
            } // Visualizza la pagina personale di un locale
            else if (action.equals("locale")) {
                String nome = (String) request.getParameter("nome");
                List<String[]> risultato = gestore.cercaUno(nome, "locale");
                HttpSession s = request.getSession();
                if (s.getAttribute("group") != null
                        && s.getAttribute("login") != null
                        && s.getAttribute("group").equals("locale")
                        && s.getAttribute("login").equals(nome)) {
                    List<String[]> risEventi = gestore.cercaEvento(nome);
                    s.setAttribute("elencoEventi", risEventi);
                }
                s.setAttribute("risultato", risultato.get(0));
                risultato.remove(0);
                s.setAttribute("recensioni", risultato);
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/locale.jsp");
                rd.forward(request, response);
            } // Effettua una recensione
            else if (action.equals("recensione")) {
                String nome = (String) request.getParameter("nome");
                String dettagli = (String) request.getParameter("dettagli");
                HttpSession s = request.getSession();
                String cliente = (String) s.getAttribute("login");
                String valutazione = request.getParameter("valutazione");
                gestore.addRecensione(nome, cliente, dettagli, valutazione);
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/Servlet?action=locale&nome=" + nome);
                rd.forward(request, response);
            } // Visualizza la pagina di creazione di un nuovo evento
            else if (action.equals("creaEvento")) {
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/creaEvento.jsp");
                rd.forward(request, response);
            } // Crea un nuovo evento
            else if (action.equals("inserisciEvento")) {
                String nome = request.getParameter("nome");
                String locale = request.getParameter("locale");
                String descrizione = request.getParameter("descrizione");
                String data = request.getParameter("data");
                int posti = Integer.parseInt((request.getParameter("posti")));
                String immagine = request.getParameter("immagine");
                boolean ris = gestore.addEvento(locale, nome, descrizione, data, posti, immagine);
                if (!ris) {
                }
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/Servlet?action=evento&nome=" + nome);
                rd.forward(request, response);
            } // Visualizza un evento
            else if (action.equals("evento")) {
                String nome = (String) request.getParameter("nome");
                List<String[]> risultato = gestore.cercaUno(nome, "evento");
                HttpSession s = request.getSession();
                s.setAttribute("risultato", risultato.get(0));
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/evento.jsp");
                rd.forward(request, response);
            } // Elimina un evento
            else if (action.equals("cancellaEvento")) {
                String nome = (String) request.getParameter("nome");
                gestore.rimuoviEvento(nome);
                HttpSession s = request.getSession();
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/Servlet?action=locale&nome=" + s.getAttribute("login"));
                rd.forward(request, response);
            } // Visualizza le prenotazioni
            else if (action.equals("visualizzaPrenotazioni")) {
                HttpSession s = request.getSession();
                String login = (String)s.getAttribute("login");
                if(login != null) {
                    List<String[]> prenotazioni = null;
                    if(s.getAttribute("group").equals("locale")) {
                        prenotazioni = gestore.visualizzaPrenotazioni(login);
                    }
                    else {
                        prenotazioni = gestore.visualizzaPrenotazioniUtente(login);
                    }
                    s.setAttribute("prenotazioni", prenotazioni);
                    RequestDispatcher rd = getServletContext().getRequestDispatcher("/prenotazioni.jsp");
                    rd.forward(request, response);
                }
                else {
                    RequestDispatcher rd = getServletContext().getRequestDispatcher("/errore.jsp");
                    rd.forward(request, response);
                }
            } // Elimina una prenotazione
            else if (action.equals("cancellaPrenotazione")) {
                String id = (String) request.getParameter("id");
                gestore.rimuoviPrenotazione(Long.parseLong(id));
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/Servlet?action=visualizzaPrenotazioni");
                rd.forward(request, response);
            } // Elimina una prenotazione
            else if (action.equals("download")) {
                String group = (String) request.getSession().getAttribute("group");
                if(group != null && group.equals("locale")) {
                    String namefile = "/home/ciro/UniTo/Magistrale/SSCSWeb/EsameSSCSWeb/EsameSSCSWeb-war/web/download/ClientLocali.jar";
                    ServletOutputStream stream = response.getOutputStream();
                    response.setContentType("application/java-archive");
                    response.addHeader("Content-Disposition", "attachment; filename=ClientLocali.jar");
                    File f = new File(namefile);
                    FileInputStream buf = new FileInputStream(f);
                    int readBytes = 0;
                    while ((readBytes = buf.read()) != -1) {
                        stream.write(readBytes);
                    }
                    stream.close();
                    buf.close();
                    //RequestDispatcher rd = getServletContext().getRequestDispatcher("/download/ClientLocali.jar");
                    //rd.forward(request, response);
                } else {
                    RequestDispatcher rd = getServletContext().getRequestDispatcher("/index.jsp");
                    rd.forward(request, response);
                }
            } // Elimina una prenotazione
            else if (action.equals("random")) {
                List<String[]> locali = gestore.randomLocali();
                List<String[]> eventi = gestore.randomEventi();
                HttpSession s = request.getSession();
                s.setAttribute("locali", locali);
                s.setAttribute("eventi", eventi);
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/index.jsp");
                rd.forward(request, response);
            } else {
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/index.jsp");
                rd.forward(request, response);
            }
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
